package arr;

import java.util.Arrays;

/**
 * 合并两个有序数组 -88
 * @author yyz
 * @create 2023-11-12 15:08
 */
public class 合并两个有序数组 {
    /**
     * 合并两个有序数组
     *
     * @param n1 第一个有序数组，长度为 m+n，其中前 m 个元素表示有效元素
     * @param m  第一个有序数组的有效元素个数
     * @param n2 第二个有序数组，长度为 n
     * @param n  第二个有序数组的元素个数
     */
    private static void merge(int[] n1, int m, int[] n2, int n) {
        // 初始化指针，p1 指向 n1 的末尾有效元素，p2 指向 n2 的末尾元素，tail 指向合并后的数组末尾
        int p1 = m - 1, p2 = n - 1;
        int tail = m + n - 1;

        // 从后往前比较并合并两个数组的元素
        while (p1 >= 0 && p2 >= 0) {
            n1[tail--] = n2[p2] > n1[p1] ? n2[p2--] : n1[p1--];
        }

        // 如果 n1 中的元素已经全部比较完，而 n2 中还有剩余，则将剩余的 n2 数组元素复制到 n1 中
        if (p1 < 0) {
            System.arraycopy(n2, 0, n1, 0, p2 + 1);
        }
    }


    public static void main(String[] args) {
        int[] n1 = {2, 0};
//        n1 = new int[]{0};
        int[] n2 = {1};
//        n2 = new int[]{1};
        merge(n1, 1, n2, 1);
        System.out.println(Arrays.toString(n1));
    }
}
